package com.atjava.nebula.core.dao.dialect;

import java.math.BigDecimal;
import java.math.BigInteger;

public class MySQLDialect implements Dialect {

	protected static final String SQL_END_DELIMITER = ";";

	public String getLimitString(String sql, boolean hasOffset) {
		return new StringBuffer(sql.length() + 20).append(trim(sql)).append(
				hasOffset ? " limit ?,?" : " limit ?")
				.append(SQL_END_DELIMITER).toString();
	}

	public String getLimitString(String sql, int offset, int limit ,Object[] parameters) {
		sql = trim(sql);
		sql = setParam(sql, parameters);
		StringBuffer sb = new StringBuffer(sql.length() + 20);
		sb.append(sql);
		if (offset > 0) {
			sb.append(" limit ").append(offset).append(',').append(limit)
					.append(SQL_END_DELIMITER);
		} else {
			sb.append(" limit ").append(limit).append(SQL_END_DELIMITER);
		}
		return sb.toString();
	}

	public boolean supportsLimit() {
		return true;
	}

	private String trim(String sql) {
		sql = sql.trim();
		if (sql.endsWith(SQL_END_DELIMITER)) {
			sql = sql.substring(0, sql.length() - 1
					- SQL_END_DELIMITER.length());
		}
		return sql;
	}
	
	private String setParam(String sql , Object[]parameters){
		if(parameters.length>0){
			String []sqlSect=sql.split("\\?");
			StringBuilder sqlStr=new StringBuilder();
			for(int i=0 ; i< parameters.length ; i++){
				sqlStr.append(sqlSect[i]);
				Object para=parameters[i];
				if(		   para instanceof Integer 
						|| para instanceof Double
						|| para instanceof BigDecimal
						|| para instanceof BigInteger
						|| para instanceof Float)
					sqlStr.append(para.toString());
				else if(para instanceof Boolean){
					if((Boolean)para)
						sqlStr.append("1");
					else
						sqlStr.append("0");
				}
				else //其它类型（包括日期型），都加上单引号
					sqlStr.append("'").append(para.toString()).append("'");
				parameters[i]=null;					
			}
			sqlStr.append(sqlSect[sqlSect.length-1]);
			return sqlStr.toString();
		}
		else{
			return sql;
		}
	}

}
